package priv.leetCode.hash;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.*;

/*
 * 作者：m鹏h
 * 时间；2024/5/26 14:33
 * 描述：
 **/
@Slf4j
public class Array {

    //定义一个数组 在这个数组中的两个任意数相加得定义得变量,则打印该两个数的下表
    @Test
    public void test1() {
        int[] nums = {1,2,4};
        int target = 6;

          boolean isExit = false;
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            //得出另一半的数
            int complement = target - nums[i];
            //校验另一半的数是否存在map中
            if (map.containsKey(complement)) {
                isExit=true;
                //输出另一半的数的下表，和当前数的下标。
                System.out.println(Arrays.toString(new int[]{map.get(complement), i}));
            }

            map.put(nums[i], i);
        }
        if (!isExit){
            System.out.println("以上数组中没有两个任意数相加得定义得变量的数据！！！");
        }

    }

    //给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
    //字母异位词 字符串中相同字母的不同排序。
    @Test
    public void test2() {
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};

        HashMap<String, List<String>> map = new HashMap<>();
        Arrays.stream(strs).forEach(str -> {
            //对单个字符串进行分割
            String[] split = str.split("");
            //对分割后的字符串进行排序，得出一个新的字符串
            Arrays.sort(split);
            String s = Arrays.toString(split);
            //校验map 中是否有排序后的字符串作为key
            if (!map.containsKey(s)){
                //没有则使用新的排序后的字符串作为key，重新创建一个List
                map.put(s,new ArrayList<>());
            }
            //对排序后的字符串为key,对应的value中存值
            map.get(s).add(str);
        });

        //遍历每个key 的value数据
        for (Map.Entry<String, List<String>> mapObjeck : map.entrySet()) {
            System.out.println(mapObjeck.getValue());
        }


    }

    //最长连续序列
    //给定一个未排序的整数数组 nums ，找出数字连续的最长序列（不要求序列元素在原数组中连续）的长度。
    //请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
    @Test
    public void test3() {
        Integer[] nums = {1, 3,5,100,20,101,0 ,2,4};

        //把数组放入set集合中
        HashSet<Integer> numsSet = new HashSet<>(Arrays.asList(nums));

        //定义一个变量，用于计算最大的连续序列
       Integer countNum=0;

        for (Integer num : numsSet) {
            //当前数的前一位数在这个集合中已经被考虑过，为了避免重复计算，检查num-1不在集合中
            if (!numsSet.contains(num-1)){
                int currentNum = num;
                int currentStreak = 1;
                //因为题目要求时间复杂度为 O(n) 的算法，所以用while依次遍历
                //校验当前数+1是否在集合中，在这为连续序列 则currentStreak+1，currentNum+1连续校验；
                while (numsSet.contains(currentNum+1)){
                    currentStreak++;
                    currentNum++;
                }
                //用于比较最长序列的长度
                countNum = Math.max(countNum,currentStreak);
            }
        }
        System.out.println(countNum);



    }

    @Test
    public void test4() {
        int[] nums = {0,1,0,3,12};
            int index = 0;
            int n = 0;
            for(int i = 0; i < nums.length; i++){
                if(nums[i] != 0){
                    n = nums[i];
                    nums[i] = 0;
                    nums[index++] = n;
                }
            }
            log.error("移动后的数组 {}",nums);

    }













}
